查看原文
其他

互联网计算机技术概述

Dfifans DFINITY 2022-07-07




在互联网计算机(由运行高级分散协议的独立数据中心网络创建的公共软件开发平台)全面启动之前的最后一个里程碑即将来临。

在9月30日发布Sodium的虚拟活动中,DFINITY基金会将推出网络神经系统,这是一个控制互联网计算机的开放算法管理系统。

该活动还将展示有关高级加密技术、共识协议和令牌经济学的深入技术资料。

在这一重要时刻之前,我们希望向公众提供有关网络运行方式的非常高层次的概述。

网络神经系统

互联网计算机基于称为互联网计算机协议(ICP)的区块链计算机协议。网络本身是根据层次结构构建的,底部是托管专用硬件节点的独立数据中心。

这些节点机器组合在一起以创建子网。子网托管软件容器,这些容器是可互操作的计算单元,由用户上载并且包含代码和状态。


使ICP独树一帜的要素之一是网络神经系统(NNS),它负责控制、配置和管理网络。

数据中心通过向负责引入数据中心的NNS申请加入网络。尽管NNS本身具有开放的治理系统,但它监督参与网络的权限。

从某种意义上说,它起着与互联网上的ICANN等效的作用,除其他功能外,它为想要运行BGP路由器的人分配自治系统号。

NNS承担着广泛的网络管理角色,包括监视节点计算机以查找互联网计算机网络上的统计偏差,这可能表明性能不佳或行为错误。

NNS在网络令牌经济学中也起着关键作用。NNS会生成新的ICP令牌(以前称为DFN令牌),以奖励由数据中心和在NNS中进行投票的神经元运行的节点,这是它决定提交给它的提案的方式。

当NNS创建新的ICP令牌来奖励数据中心和神经元时,这是通货膨胀的。


最终,数据中心所有者和神经元所有者可以获取其令牌并与容器所有者和管理者进行交换。容器所有者和管理者将这些令牌转换为周期,并使用这些周期来为其容器充值。

例如,当这些容器执行计算或存储内存时,它们会在整个循环中消耗燃烧尽,最终必须为它们补充更多的循环才能继续运行。那是通货紧缩。

子网

要了解互联网计算机,您必须了解子网的概念,子网是整个网络的基本组成部分。子网负责托管互联网计算机网络托管的软件容器的不同子集。

通过以NNS控制的方式将从不同数据中心提取的节点机器聚集在一起来创建子网。

这些节点机器通过ICP进行协作,以对称地复制与它们所托管的软件容器有关的数据和计算。


NNS在构建子网时会合并来自独立数据中心的节点。通过使用DFINITY开发的拜占庭容错技术和密码技术,ICP协议可以确保子网防篡改和不可阻挡。

尽管子网是整个互联网计算机网络的基本组成部分,但它们对用户和软件是透明的。用户和容器软件仅需要知道容器的身份即可调用其共享的功能。

这种透明性是互联网基本设计原则的延伸。在互联网上,如果用户要连接到某些软件,则只需知道运行该软件的计算机的IP地址和该软件正在侦听的TCP端口。

在互联网计算机上,如果用户希望调用功能,则只需要知道容器的身份和功能签名即可。

与互联网创建无缝连接的方式一样,DFINITY也创建了软件的无缝空间,其中任何获得许可的软件都可以直接调用任何其他软件,而无需了解网络的基本运行情况。

互联网计算机还以其他方式确保子网的透明性。例如,NNS可以拆分和合并子网,以便平衡整个网络的负载。这对于托管容器也是透明的。


在此示例中,我们有一个虚拟的子网ABC,该子网承载11个容器,NNS告诉它拆分。

子网ABC继续使用容器1–6,并生成了一个新子网,子网XYZ,其继续使用容器7–11。所涉及的所有容器都不会遇到服务中断的情况。

当您将容器上传到互联网计算机时,必须针对特定的子网类型。实际上,有一个托管NNS的特殊子网,但是您无法将容器上传到该子网。相反,您必须定位子网类型,例如“数据”、“系统”或“基准”。


每种子网类型都会为您的容器提供某些属性和功能。例如,如果您的容器托管在数据子网中,则它可以处理呼叫,但不能调用其他容器。为此,您需要一个系统子网。

如果希望您的容器能够保持ICP令牌的余额或将周期发送到其他容器,则需要一个受信任的子网。由于这些原因,治理容器只能托管在受信任的子网中。


子网的功能部分源自潜在的容错能力。这是基础科学领域中令人兴奋的领域,我们希望很快与公众分享,其中包括允许NNS修复损坏的子网的新加密技术。

容器

子网的目的是托管容器。容器在专用的管理程序中运行,并通过公共指定的API相互交互。容器内部是可在WebAssembly虚拟机上运行的WebAssembly字节码及其中运行的内存页面。

通常,将通过编译诸如Rust或Motoko之类的编程语言来创建该WebAssembly字节码。该字节码将包含一个运行时,使开发人员可以轻松地与API进行交互。

注意:此处显示的示例代码是伪代码。


在互联网计算机上,必须以两种方式之一来调用容器共享的功能。它们可以作为更新调用或查询调用。

本质上的区别是,当您将函数作为更新调用时,其对容器内存中的数据所做的任何更改都将保留,而如果将函数作为查询调用时,则其对内存的任何更改都将在运行后被丢弃。

更新调用会进行持久更改,而且它们也是防篡改的,因为ICP区块链计算机协议在子网的每个节点上运行它们。

如您所料,这些调用使用允许在完全确定的执行环境中并发执行的机制,在一致的全局调用顺序中运行。更新呼叫仅需两秒钟即可完成。


在此示例中,用户向容器内托管的金融交易所提交购买订单。

另一方面,查询调用不会保留更改。它们对内存所做的任何更改在运行后都会被丢弃。它们非常高效且廉价,并且仅需几毫秒即可完成。

这是因为它们未在子网中的所有节点上运行,这也意味着它们提供了较低的安全级别。


在此示例中,用户正在请求自定义新闻源,并且几乎立即获得了新生成的内容。

正交持久性

关于互联网计算机,最有趣的事情之一就是开发人员保留数据的方式。开发人员不必考虑持久性,他们只需编写代码,持久性就会自动发生。这称为正交持久性。这是因为互联网计算机会保留其中运行代码的内存页。

您可能想知道这一切如何工作。关于可以使内存页面发生变化的更新调用,容器是软件参与者。这意味着在任何给定时间,容器内只能有一个执行线程。


尽管容器内只有一个执行线程,但默认情况下可以交叉进行跨容器更新调用。当更新调用进行跨容器更新调用时会发生这种情况,该调用会阻塞,从而使执行线程可以移至新的更新调用。


相比之下,查询调用不会对内存进行永久更改。这样一来,在任何给定时间,容器内可以有任意数量的并发线程来处理查询调用。这些查询调用针对最后确定的状态根中记录的内存快照运行。

最后,如果不提及容器可以创建新的容器以及容器可以分叉,那么对容器的讨论将是不完整的。您只需指定WebAssembly字节码即可创建一个新的容器,并且内存页开始为空。

当容器分叉时,将创建一个新生成的副本,该副本与内部的内存页面相同。创建可扩展的互联网服务时,分叉功能非常强大。

可扩展性

现在来对扩展的互联网服务进行高级解释,容器在其各种类型的容量上都有上限。例如,由于WebAssembly的限制,一个容器只能存储4GB的内存页面。

因此,当我们要创建可扩展到数十亿用户的互联网服务时,我们必须使用多容器架构。


我们可能希望创建一个特殊的容器,创建容器的许多副本,然后将用户内容分片到不同的容器以创建可扩展的互联网服务就足够了。不幸的是,由于多种原因,该架构太简单了。

的确,每个额外的容器都会增加整体内存容量。也确实,每个其他容器都会增加整体更新和查询调用的吞吐量。但是我们无法扩展特定用户内容的查询呼叫请求。

每当我们通过添加更多的容器分片来增加系统容量时,我们都需要重新平衡用户内容,这并不是真正的边缘架构。

也没有明显的方法从与他们非常接近的副本中向最终用户提供查询调用,我们将同时需要前端容器和后端容器。


互联网计算机提供了一些有趣的功能,可以将最终用户连接到前端容器。其中之一允许域名通过NNS映射到多个前端容器。

当最终用户希望解析这样的域名时,互联网计算机将查看托管前端容器的所有子网中所有副本节点的总数,并返回最接近的副本节点的IP地址。

这导致最终用户在附近的副本上执行查询调用,从而减少了固有的网络等待时间并改善了用户体验,从而在没有内容分发网络的情况下提供了边缘计算的优势。


为了充分利用此功能,我们需要一个涉及前端容器和后端数据桶容器的经典架构。在此示例中,Web浏览器希望加载个人资料图片。


首先,Web浏览器将映射到运行在具有附近节点的子网上的前端容器。然后,Web浏览器将提交查询调用请求,以将照片检索到附近的节点。


然后,前端容器将向保存照片的数据桶容器发出跨容器查询调用请求。


如果数据存储桶容器返回的查询调用响应涉及静态内容(例如照片),则可以将数据存储在缓存中。在这种情况下,运行前端容器查询调用的副本节点可以将查询调用响应输入到其查询缓存中。

当然,查询调用缓存机制对于前端容器代码是完全透明的。一旦用户调用的前端容器收集了所有必要的信息,它就可以通过查询调用响应或HTTP端点返回内容。


随着时间的流逝,节点的查询缓存会累积静态内容并生成附近用户感兴趣的数据,从而为他们提供更快、更好的用户体验。

这样,互联网计算机的本机边缘体系结构提供了内容分发网络的优势,但无需开发人员做任何特殊的事情,也无需征集单独的专有服务的帮助。


对于更新调用,经典体系结构采用了不同的方法。必须序列化对用户内容和数据的更新,以防止诸如更新丢失之类的问题。通常,这是通过仅散列用户名来将用户映射到特定的前端容器来实现的。


一旦在Web浏览器或智能手机上运行的UX/UI确定了哪个前端容器负责协调对某些内容或数据的更改,便可以通过向其标准界面提交更新调用来修改该内容或数据。


然后,此前端容器通常会进行更多的跨容器更新调用,以实现所需的更改。

开放式互联网服务

总结一下,让我们讨论使用带有前端容器和后端数据桶容器的两级体系结构设计开放式互联网服务。首先,在编写前端容器代码时,将使用现有的名为BigMap的库类使生活变得轻松。


BigMap可以存储EB级数据,您可以仅使用一行代码就可以向其中写入对象。通过使前端容器和数据桶容器分叉,以在两个容器之间分配给一个容器的对象的责任,该体系结构将透明、动态地横向扩展。

最后,要创建真正的开放互联网服务,您需要将所有容器的责任分配给一个开放的令牌化治理容器。如果您是企业家,则可以通过在早期出售一些治理代币来筹集发展资金。

而且,您可能会设计方案,通过给他们治理令牌提供激励来激发互联网服务的早期参与者,从而获得更好的网络效果,并赢得竞争。

对于这个新的公共软件开发平台,我们提高了网络的创造能力,同时又将互联网恢复到其自由开放的根基,我们深感兴奋。

加入我们参加Sodium发布活动,以了解有关互联网计算机背后技术的更多信息,并通过下载DFINITY Canister SDK开始编写代码。

现在通过dfinity.org/tungsten申请访问互联网计算机的Tungsten开发人员网络。

加入我们的开发人员社区,并在forum.dfinity.org开始构建。


作者:DFINITY
翻译:Catherine


宣布SODIUM发布活动的完整议程
开发人员经验(DX)和互联网计算机
The Internet Computer
DFINITY的钠发布+空投更新
DFINITY Canister SDK
Deploying First Application


进Dfinity官方社群,请添加小助手微信:

comiocn




长按关注

Dfinity官方微信

给你第一手资讯和项目信息

更可随时答疑解惑



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存